home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / net / RCS / getprotoent.c,v < prev    next >
Text File  |  1988-06-20  |  2KB  |  138 lines

  1. head     1.1;
  2. access   ;
  3. symbols  ;
  4. locks    ; strict;
  5. comment  @ * @;
  6.  
  7.  
  8. 1.1
  9. date     88.06.20.09.57.11;  author ouster;  state Exp;
  10. branches ;
  11. next     ;
  12.  
  13.  
  14. desc
  15. @@
  16.  
  17.  
  18.  
  19. 1.1
  20. log
  21. @Initial revision
  22. @
  23. text
  24. @/*
  25.  * Copyright (c) 1983 Regents of the University of California.
  26.  * All rights reserved.
  27.  *
  28.  * Redistribution and use in source and binary forms are permitted
  29.  * provided that this notice is preserved and that due credit is given
  30.  * to the University of California at Berkeley. The name of the University
  31.  * may not be used to endorse or promote products derived from this
  32.  * software without specific prior written permission. This software
  33.  * is provided ``as is'' without express or implied warranty.
  34.  */
  35.  
  36. #if defined(LIBC_SCCS) && !defined(lint)
  37. static char sccsid[] = "@@(#)getprotoent.c    5.4 (Berkeley) 3/7/88";
  38. #endif /* LIBC_SCCS and not lint */
  39.  
  40. #include <stdio.h>
  41. #include <sys/types.h>
  42. #include <sys/socket.h>
  43. #include <netdb.h>
  44. #include <ctype.h>
  45.  
  46. #define    MAXALIASES    35
  47.  
  48. static char PROTODB[] = "/etc/protocols";
  49. static FILE *protof = NULL;
  50. static char line[BUFSIZ+1];
  51. static struct protoent proto;
  52. static char *proto_aliases[MAXALIASES];
  53. static char *any();
  54. int _proto_stayopen;
  55.  
  56. setprotoent(f)
  57.     int f;
  58. {
  59.     if (protof == NULL)
  60.         protof = fopen(PROTODB, "r" );
  61.     else
  62.         rewind(protof);
  63.     _proto_stayopen |= f;
  64. }
  65.  
  66. endprotoent()
  67. {
  68.     if (protof) {
  69.         fclose(protof);
  70.         protof = NULL;
  71.     }
  72.     _proto_stayopen = 0;
  73. }
  74.  
  75. struct protoent *
  76. getprotoent()
  77. {
  78.     char *p;
  79.     register char *cp, **q;
  80.  
  81.     if (protof == NULL && (protof = fopen(PROTODB, "r" )) == NULL)
  82.         return (NULL);
  83. again:
  84.     if ((p = fgets(line, BUFSIZ, protof)) == NULL)
  85.         return (NULL);
  86.     if (*p == '#')
  87.         goto again;
  88.     cp = any(p, "#\n");
  89.     if (cp == NULL)
  90.         goto again;
  91.     *cp = '\0';
  92.     proto.p_name = p;
  93.     cp = any(p, " \t");
  94.     if (cp == NULL)
  95.         goto again;
  96.     *cp++ = '\0';
  97.     while (*cp == ' ' || *cp == '\t')
  98.         cp++;
  99.     p = any(cp, " \t");
  100.     if (p != NULL)
  101.         *p++ = '\0';
  102.     proto.p_proto = atoi(cp);
  103.     q = proto.p_aliases = proto_aliases;
  104.     if (p != NULL) {
  105.         cp = p;
  106.         while (cp && *cp) {
  107.             if (*cp == ' ' || *cp == '\t') {
  108.                 cp++;
  109.                 continue;
  110.             }
  111.             if (q < &proto_aliases[MAXALIASES - 1])
  112.                 *q++ = cp;
  113.             cp = any(cp, " \t");
  114.             if (cp != NULL)
  115.                 *cp++ = '\0';
  116.         }
  117.     }
  118.     *q = NULL;
  119.     return (&proto);
  120. }
  121.  
  122. static char *
  123. any(cp, match)
  124.     register char *cp;
  125.     char *match;
  126. {
  127.     register char *mp, c;
  128.  
  129.     while (c = *cp) {
  130.         for (mp = match; *mp; mp++)
  131.             if (*mp == c)
  132.                 return (cp);
  133.         cp++;
  134.     }
  135.     return ((char *)0);
  136. }
  137. @
  138.